package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class IODemo7 {
    public static void main(String[] args) throws IOException {
//        InputStream inputStream = null;
//        try {
//            //打卡文件
//             inputStream  = new FileInputStream("./test.txt");//inputStream的子类,从文件来读取 . 创建对象的过程,激素打开文件的过程
//            //所谓面向对象就是通过代码抽象的表示实际事物的一种方式
//        }finally {
//            //关闭文件
//            inputStream.close();//释放了文件的相关资源(进程=>PCB(一个或多个)文件描述表,记录了当前进程都打开了哪些文件)
//            //顺序表/数组  数组中的每一个元素都是一个结构体,这个结构体就具体描述了你打开这个文件自文件系统上的一些属性
//            //打开一个文件,都要在文件描述符表占一个位置,如果不关闭,还一直打开,就会耗尽它(文件描述表的长度是有上限的)
//            //这也就叫:文件资源泄露
//        }
        //其他逻辑

        //另一种写法
        try (InputStream inputStream = new FileInputStream("./test.txt")){//不需要手动调用close
        //一旦代码出了try代码块,此时try自动调用inputStream的close
            //这种类必须实现Closeable接口才能用try with resources机制
            //读文件
//            byte[] buffer = new byte[1024];
//            inputStream.read(buffer);//使用read的时候,往往定义一个内容为空的数组(非Null)把空的数组交给read,read内部对数组内容进行填充
            //在不知道文件有多少个字节的情况下,用while来完成
            while (true) {
//                int b = inputStream.read();
//                if(b == -1) {
//                    //文件读取完了
//                    break;
//                }
//                //打印这个字节的数据(以十六进制的形式来打印)
//
//               System.out.printf("%x ", b);
                //一次读若干个字节
                byte[] buffer = new byte[1024];
                //buffer是表示缓冲区的意思,后续read会尝试把这数组填满
                int n = inputStream.read(buffer);
                if(n == -1) {
                    //文件读取完毕了
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x ",buffer[i]);
                }

            }



        }



    }
}
